package com.gonsin.i18n.logic;

import com.gonsin.i18n.logic.config.I18nConfig;
import com.gonsin.i18n.logic.models.KeywordModel;
import com.gonsin.i18n.logic.services.I18nInstance;

import com.gonsin.i18n.logic.services.KeywordFileModel;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.List;
import java.util.Map;

@ComponentScan("com.gonsin.i18n.logic")
public class T {


    /**
     * @deprecated 弃用，后续不在T方法内做 format工作
     *
     *
     * 根据原文获取翻译后的内容
     * @param lang 语言平台（自定义）
     * @param content 原文本
     * @param args 文本内如果包含{}动态变量时需要传递变量值。
     * @return i18n平台翻译后的内容
     */
    @Deprecated
    public static String t(String lang, String content, Object ... args){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        return I18nInstance.getInstance().t(lang, content, null, args);
    }


    /**
     * 根据原文获取翻译后的内容
     * @param lang 语言平台（自定义）
     * @param content 原文本
     * @return i18n平台翻译后的内容
     */
    public static String t(String lang, String content){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        return I18nInstance.getInstance().t(lang, content, null);
    }


    /**
     * @deprecated 弃用，后续不在T方法内做 format工作
     *
     *
     * 根据原文获取翻译后的内容
     * @param content 原文本
     * @param args 文本内如果包含{}动态变量时需要传递变量值。
     * @return i18n平台翻译后的内容
     */
    @Deprecated
    public static String t(String content, Object ... args){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        I18nConfig config = I18nInstance.CONFIG;
        String lang = config.getDefaultLang();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(attributes != null){
            String tempLang = attributes.getRequest().getHeader(config.getHeaderLangName());
            if(!StringUtils.isEmpty(tempLang)){
                lang = tempLang;
            }
        }
        return I18nInstance.getInstance().t(lang, content, null, args);
    }


    /**
     * 根据原文获取翻译后的内容
     * @param content 原文本
     * @return i18n平台翻译后的内容
     */
    public static String t(String content){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        I18nConfig config = I18nInstance.CONFIG;
        String lang = config.getDefaultLang();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(attributes != null){
            String tempLang = attributes.getRequest().getHeader(config.getHeaderLangName());
            if(!StringUtils.isEmpty(tempLang)){
                lang = tempLang;
            }
        }
        return I18nInstance.getInstance().t(lang, content, null);
    }


    /**
     * 根据原文获取翻译后的内容
     * @param lang 语言平台（自定义）
     * @param content 原文本
     * @param common 不做显示，告诉翻译人员应该如何翻译
     * @return i18n平台翻译后的内容
     */
    public static String text(String lang, String content, String common){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        return I18nInstance.getInstance().t(lang, content, common);
    }


    /**
     * 根据原文获取翻译后的内容
     * @param content 原文本
     * @param common 不做显示，告诉翻译人员应该如何翻译
     * @return i18n平台翻译后的内容
     */
    public static String text(String content, String common){
        if(null == content){
            return null;
        }
        if("".equals(content)){
            return "";
        }
        I18nConfig config = I18nInstance.CONFIG;
        String lang = config.getDefaultLang();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(attributes != null){
            String tempLang = attributes.getRequest().getHeader(config.getHeaderLangName());
            if(!StringUtils.isEmpty(tempLang)){
                lang = tempLang;
            }
        }
        return I18nInstance.getInstance().t(lang, content, common);
    }


    /**
     * 修改I18n配置内容
     * @param config
     */
    public static void config(I18nConfig config){
        I18nInstance.config(config);
    }


    /**
     * 获取I18n配置内容
     */
    public static I18nConfig config(){
        return I18nInstance.CONFIG;
    }



    /**
     * 查询该语言当前所有的翻译
     */
    public static Map<String, String> allKeywords(String project, String lang) {
        return I18nInstance.getInstance().keywords(project, lang);
    }

    /**
     * 查询当前所有已添加的语言
     */
    public static List<KeywordModel> allLang(String projectName) {
        return I18nInstance.getInstance().langs(projectName);
    }

    /**
     * 插入新的语言
     */
    public static void insertNewKeyword(String projectName, String lang, String originWord, String translateWord) {
        I18nInstance.getInstance().add(projectName, lang, originWord, translateWord, false, null);
    }

    /**
     * 插入新的语言
     */
    public static void insertNewKeyword(String projectName, String lang, String originWord, String translateWord, String common) {
        I18nInstance.getInstance().add(projectName, lang, originWord, translateWord, false, common);
    }

    /**
     * 插入新的语言
     */
    public static void insertNewKeyword(String projectName, String lang, String originWord, String translateWord, boolean fromClient) {
        I18nInstance.getInstance().add(projectName, lang, originWord, translateWord, fromClient, null);
    }

    /**
     * 插入新的语言
     */
    public static void insertNewKeyword(String projectName, String lang, String originWord, String translateWord, boolean fromClient, String common) {
        I18nInstance.getInstance().add(projectName, lang, originWord, translateWord, fromClient, common);
    }

    /**
     * 插入新的语言
     */
    public static void updateKeyword(String projectName, String lang, String originWord, String translateWord) {
        I18nInstance.getInstance().update(projectName, lang, originWord, translateWord);
    }

    /**
     * 新建一个新的语言
     */
    public static void newKeyword(KeywordModel model) {
        I18nInstance.getInstance().addKeyword(model);
    }


    /**
     * 导入一个新语言
     * @param projectMap 一个项目对应的语言
     *                   key = projectName
     *                   value = 语言包描述
     */
    public static void importKeyword(Map<String, KeywordFileModel> projectMap) {
        I18nInstance.getInstance().importKeyword(projectMap);
    }


    /**
     * 导入一个新语言
     * @param projectName 项目名字
     * @param lang 语言名字
     */
    public static void importProjectKeyword(String projectName, String lang, KeywordFileModel keywordFileModel) {
        I18nInstance.getInstance().importProjectKeyword(projectName, lang, keywordFileModel);
    }

    /**
     * 导出一个新语言，一次会导出多个项目同一个语言的内容
     * @param  lang 语言
     *
     */
    public static @Nullable Map<String, KeywordFileModel> exportKeyword(String lang) {
        return I18nInstance.getInstance().exportKeyword(lang);
    }

    /**
     * 导出一个新语言，一次会导出多个项目同一个语言的内容
     * @param  lang 语言
     *
     */
    public static @Nullable KeywordFileModel exportProjectKeyword(String projectName, String lang) {
//        return I18nInstance.getInstance().exportKeyword(lang);
        return I18nInstance.getInstance().exportProjectKeyword(projectName, lang);
    }

    /**
     * 删除一个语言
     */
    public static void deleteKeyword(String lang) {
        I18nInstance.getInstance().deleteKeyword(lang);
    }

    /**
     * 删除一个词语
     */
    public static void deleteWord(String projectName, String lang, String originWord) {
        I18nInstance.getInstance().deleteWord(projectName, lang, originWord);
    }


    /**
     * 创建项目如果不存在
     * @param projectName
     */
    public static void createIfNotExist(String projectName){
        I18nInstance.getInstance().createIfNotExist(projectName);
    }
}
